package cn.smile.business.basic;

import cn.smile.bean.dto.basic.ExpenseBillDTO;
import cn.smile.bean.entity.basic.ExpenseBill;
import cn.smile.bean.form.basic.bill.ExpenseAddForm;
import cn.smile.bean.form.basic.bill.QueryExpenseForm;
import cn.smile.commons.domain.IBaseService;
import cn.smile.commons.enums.basic.MiniProjectCountEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.math.BigDecimal;
import java.util.List;

public interface IExpenseBillService extends IBaseService<ExpenseBill> {

    /**
     * 新增消费账单
     *
     * @param form 新增参数
     * @return 新增结果
     */
    Boolean addExpense(ExpenseAddForm form);

    /**
     * 分页查询消费账单
     *
     * @param form 分页参数
     * @return 查询结果
     */
    IPage<ExpenseBillDTO> getPage(QueryExpenseForm form);

    /**
     * 列表查询消费账单
     *
     * @param form 查询参数
     * @return 查询结果
     */
    List<ExpenseBillDTO> getList(QueryExpenseForm form);

    /**
     * 统计店铺今日消费金额
     *
     * @param countEnum 统计范围
     * @return 今日消费金额
     */
    BigDecimal countExpenseAmount(MiniProjectCountEnum countEnum);

    /**
     * 统计消费金额
     *
     * @param timeStart 统计时间-开始
     * @param timeEnd   统计时间-结束
     * @param isMember  会员标记(true-会员, false-非会员)
     * @return 统计结果
     */
    BigDecimal countExpenseAmount(String timeStart, String timeEnd, Boolean isMember);

    /**
     * 统计会员赠送金额消费额度
     * @param timeStart 统计时间-开始
     * @param timeEnd 统计时间-结束
     * @return 统计结果
     */
    BigDecimal countGiftExpenseAmount(String timeStart, String timeEnd);

    /**
     * 删除消费账单(并且退款)
     *
     * @param id 账单ID
     * @return 删除结果
     */
    Boolean delExpense(String id);

    /**
     * 统计周期内完成订单数
     *
     * @param timeStart 统计时间-开始
     * @param timeEnd   统计时间-结束
     * @param isMember  会员标记(true-会员, false-非会员)
     * @return 统计结果
     */
    Long countOrderNum(String timeStart, String timeEnd, Boolean isMember);

    /**
     * 通过ID查询消费详情
     *
     * @param id 消费单ID
     * @return 查询结果
     */
    ExpenseBillDTO getExpenseById(String id);
}
